package com.wmx.reddoor.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpSession;
import java.util.Arrays;

/**
 * 演示 Spring MVC 服务端跳转与重定向
 * 1、如果控制层需要使用服务端调整或者重定向，则不能使用 @RestController 注解
 * 2、因为 @RestController 内部包含了 @ResponseBody 注解，所有方法 return 的内容都会直接做为响应主体，不再做任何跳转。
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2022/3/17 9:47
 */
@Controller
public class JumpController {

    /**
     * http://127.0.0.1:8080/redirect
     * 1、redirect 重定向时相当于浏览器重新发起了新的请求，所以使用 {@link Model} 是无法传递参数的。
     * 2、重定向可以使用 {@link javax.servlet.http.HttpSession} 或者 {@link RedirectAttributes} 传递参数
     * 3、也可以拼在 url 地址上，如 ?a=x&b=y
     *
     * @return
     */
    @GetMapping("/redirect")
    public String redirect(RedirectAttributes attributes) {
        System.out.println("重定向到主页");
        attributes.addAttribute("attr", "厉害");
        attributes.addAttribute("param", "不得了");
        return "redirect:/home?code=7845P87";
    }

    /**
     * 跳转到前端页面
     * 1、跳转到页面，不需要加‘forward’或者‘redirect’。
     * 2、可以使用 {@link Model} 往前端传递参数。
     * 3、或者直接使用 Map 往前端传参也行，默认Map的内容会放到请求域中，页面可以直接取值。
     *
     * @param model
     * @param code
     * @param attr
     * @return
     */
    @GetMapping("/home")
    public String home(Model model, String code, String attr, String param) {
        //进入主页面：code=7845P87,attr=厉害
        System.out.println("进入主页面：code=" + code + ",attr=" + attr + ",param=" + param);
        model.addAttribute("orderList", Arrays.asList(1, 2, 3, 4, 5, 6));

        return "/index.html";
    }

    /**
     * http://127.0.0.1:8080/forward?attr=厉害
     * 1、服务器端跳转可以使用 {@link javax.servlet.http.HttpSession} 传值，也可以拼接在 url 上
     * 2、前端给本方法传递的参数，在服务器跳转到的目标方法中同样可以获取的值。
     *
     * @param session
     * @return
     */
    @GetMapping("/forward")
    public String forward(HttpSession session, String attr, RedirectAttributes attributes) {
        session.setAttribute("param", "不得了");
        attributes.addAttribute("param", "不得了");
        System.out.println("服务器端跳转到主页");
        return "forward:/home?code=7845P87";
    }

}
